package com.therouter.apt

import java.util.*

/**
 * 路由项数据类
 * 
 * 存储一个路由映射的所有信息，包括路径、目标类、动作和参数等。
 * 实现 Comparable 接口以支持排序，确保生成的代码顺序稳定。
 * 
 * @property path 路由路径，用于匹配跳转目标
 * @property className 目标 Activity/Fragment 的完整类名
 * @property action 路由动作标识，用于区分同一页面的不同跳转方式
 * @property description 路由描述信息
 * @property params 路由参数键值对，可在路由表中预设默认参数
 */
class RouteItem : Comparable<RouteItem?> {

    /** 路由路径 */
    var path = ""

    /** 目标类的完整限定名 */
    var className: String? = ""

    /** 动作标识 */
    var action = ""

    /** 路由描述 */
    var description = ""

    /** 路由参数映射 */
    var params = HashMap<String, String>()
    
    /**
     * 比较两个路由项的顺序
     * 
     * 基于类名进行字典序比较，用于排序路由列表。
     * 这确保了生成的路由文件内容顺序稳定，有利于增量编译。
     * 
     * @param routeItem 要比较的另一个路由项
     * @return 比较结果：负数表示小于，0表示相等，正数表示大于
     */
    override fun compareTo(routeItem: RouteItem?): Int {
        return if (routeItem?.className == null || className == null) {
            0
        } else routeItem.className!!.compareTo(
            className!!
        )
    }

    /**
     * 判断两个路由项是否相等
     * 
     * 基于所有属性进行深度比较，包括路径、类名、动作、描述和参数。
     * 
     * @param o 要比较的对象
     * @return 如果所有属性都相同返回 true，否则返回 false
     */
    override fun equals(o: Any?): Boolean {
        if (this === o) return true
        if (o !is RouteItem) return false
        return path == o.path &&
                className == o.className &&
                action == o.action &&
                description == o.description &&
                params == o.params
    }

    /**
     * 计算路由项的哈希码
     * 
     * 基于所有属性计算哈希值，确保相等的对象具有相同的哈希码。
     * 
     * @return 哈希码值
     */
    override fun hashCode(): Int {
        return Objects.hash(path, className, action, description, params)
    }
}